package com.ehsy.service;

import com.dtflys.forest.annotation.*;
import com.dtflys.forest.http.Lazy;
import com.ehsy.common.ResponseVo;
import com.ehsy.model.UserInfo;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title UrlParamService
 * @description
 * @create 2024/6/17 15:22
 */
@Component
@Address(host = "127.0.0.1", port = "8080")
public interface UrlParamService {
    /**
     * 直接在url字符串的问号后面部分直接写上 参数名=参数值 的形式
     * 等号后面的参数值部分可以用 {参数序号} 这种字符串模板的形式替代
     * 在发送请求时会动态拼接成一个完整的URL
     * 使用这种形式不需要为参数定义额外的注解
     *
     * 注：参数序号是从 0 开始记的方法参数的序号
     * 0 代表第一个参数，1 代表第二个参数，以此类推
     */
    @Get("/test/request/json/body?a={0}&b={1}&id=0")
    ResponseVo<Object> send1(String a, String b);

    /**
     * 直接在url字符串的问号后面部分直接写上 参数名=参数值 的形式
     * 等号后面的参数值部分可以用 {变量名} 这种字符串模板的形式替代
     * 在发送请求时会动态拼接成一个完整的URL
     * 使用这种方式需要通过 @Var 注解或全局配置声明变量
     */
    @Get("/test/request/json/body?a={a}&b={b}&id=0")
    ResponseVo<Object> send2(@Var("a") String a, @Var("b") String b);


    /**
     * 如果一个一个变量包含多个Query参数，比如: "a=1&b=2&c=3"
     * 为变量 parameters 的字符串值
     * 就用 ${变量名} 这种字符串模板格式
     * 使用这种方式需要通过 @Var 注解或全局配置声明变量
     */
    @Get("/test/request/json/body?${parameters}")
    ResponseVo<Object> send3(@Var("parameters") String parameters);


    /**
     * 使用 @Query 注解，可以直接将该注解修饰的参数动态绑定到请求url中
     * 注解的 value 值即代表它在url的Query部分的参数名
     */
    @Get("/test/request/json/body")
    ResponseVo<Object> send4(@Query("a") String a, @Query("b") String b);



    /**
     * 使用 @Query 注解，可以修饰 Map 类型的参数
     * 很自然的，Map 的 Key 将作为 URL 的参数名， Value 将作为 URL 的参数值
     * 这时候 @Query 注解不定义名称
     */
    @Get("/test/request/json/body")
    ResponseVo<Map<String, Object>> send5(@Query Map<String, Object> map);


    /**
     * @Query 注解也可以修饰自定义类型的对象参数
     * 依据对象类的 Getter 和 Setter 的规则取出属性
     * 其属性名为 URL 参数名，属性值为 URL 参数值
     * 这时候 @Query 注解不定义名称
     */
    @Get("/test/request/json/body")
    ResponseVo<UserInfo> send6(@Query UserInfo user);

    /**
     * 接受列表参数为URL查询参数
     */
    @Get("/test/request/json/body")
    ResponseVo<List<Integer>> send7(@Query("id") List<Integer> idList);

    /**
     * 接受数组参数为URL查询参数
     */
    @Get("/test/request/json/body")
    ResponseVo<List<Integer>> send8(@Query("id") Integer[] idList);

    /**
     * 延迟quary参数
     */
    @Post("/test/request/json/formBody")
    ResponseVo<Map<String, Object>> send9(@Query("a") String a, @Query("b") String b, @Query("name") Lazy<String> id);

}
